﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Windows;
using System.Windows.Documents;
using InnvoiceActual.BaseDeDatos.innvoicedbDataSetTableAdapters;
using InnvoiceActual.Logica.GestorObject;
using InnvoiceActual.Logica.GestorObject.Articulo;
using MySql.Data.MySqlClient;

namespace InnvoiceActual.Logica.GestorDB
{
    public class ArticuloDB
    {

        #region Property

        EmpresaCS empresa = EmpresaCS.Instance;

        #endregion

        /**
         * CATEGORIAS
         */

        #region Categoria

        #region CRUD Categoria

        public void AddCategoriaArticulo(CategoriaArticulo categoria)
        {
            int resultadoConsulta;

            categoriaTableAdapter categoriaTableAdapter = new categoriaTableAdapter();
            var categoriaDataTable = categoriaTableAdapter.GetDataByCategoria();
            categoriaTableAdapter.Connection.Open();

            MySqlTransaction transaccion = categoriaTableAdapter.Connection.BeginTransaction();

            try
            {

                int codigoEmpresa = empresa.CodigoEmpresa;
                string descripcion = categoria.Descripcion.ToUpper();

                resultadoConsulta = categoriaTableAdapter.InsertCategoriaValues(codigoEmpresa, descripcion, 1);

                transaccion.Commit();

                if (resultadoConsulta == 1)
                {
                    MessageBox.Show("Operacion de inserción exitosa", "Información", MessageBoxButton.OK);
                }

            }
            catch (Exception e)
            {
                transaccion.Rollback();
                MessageBox.Show("Error AddCategoriaArticulo - ArticuloDB" + e.Message, "Cuidado", MessageBoxButton.OK);
            }
            finally
            {
                categoriaTableAdapter.Connection.Close();
            }

        }

        private void UpdateCategoriaArticulo(int codigo, string descripcion, byte activo, bool mensajeConfirmacion)
        {

            int resultadoConsulta;

            categoriaTableAdapter categoriaTableAdapter = new categoriaTableAdapter();

            categoriaTableAdapter.Connection.Open();

            MySqlTransaction transaccion = categoriaTableAdapter.Connection.BeginTransaction();

            try
            {
                int codigoEmpresa = empresa.CodigoEmpresa;

                resultadoConsulta = categoriaTableAdapter.UpdateCategoria(descripcion.ToUpper(), activo, (short)codigoEmpresa, (short) codigo);
                transaccion.Commit();

                if (resultadoConsulta == 1 && mensajeConfirmacion)
                {
                    MessageBox.Show("Operacion de actualización exitosa", "Información", MessageBoxButton.OK);
                }
            }
            catch (Exception e)
            {
                transaccion.Rollback();
                MessageBox.Show("Error UpdateCategoriaArticulo - ArticuloDB" + e.Message, "Cuidado", MessageBoxButton.OK);
            }
            finally
            {
                categoriaTableAdapter.Connection.Close();
            }
        }

        public List<CategoriaArticulo> ObtenerCategoriasDeArticulosSegunEstado(byte activo)
        {
            List<CategoriaArticulo> resultados = new List<CategoriaArticulo>();
            resultados.Clear();

            categoriaTableAdapter dbCategoriasArticulo = new categoriaTableAdapter();

            try
            {
                int codigoEmpresa = empresa.CodigoEmpresa;
                DataTable tablaCategoriasArticulos = dbCategoriasArticulo.GetDataByCategoriasArticuloByEstado(activo, (short)codigoEmpresa);

                if (tablaCategoriasArticulos.Rows.Count > 0)
                {
                    foreach (DataRow item in tablaCategoriasArticulos.Rows)
                    {
                        CategoriaArticulo categoriaArticulo = new CategoriaArticulo();

                        categoriaArticulo.CodigoEmpresa = Convert.ToInt16(item["codigo_empresa"]);
                        categoriaArticulo.Codigo = Convert.ToInt16(item["codigo_categoria"]);
                        categoriaArticulo.Descripcion = item["descripcion"].ToString();
                        categoriaArticulo.Activo = Convert.ToByte(item["activo"]);

                        resultados.Add(categoriaArticulo);
                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message + "Error -- Class ArticuloDB -- Methods UpdateCategoriaArticulo(int codigo, string descripcion, byte activo, bool mensajeConfirmacion)", "Cuidado", MessageBoxButton.OK);
            }

            return resultados;
        }

        /** Usado para el Listar Categorias
         */
        public List<CategoriaArticulo> ObtenerCategoriasDeArticulos()
        {
            List<CategoriaArticulo> resultados = new List<CategoriaArticulo>();
            resultados.Clear();

            categoriaTableAdapter dbCategoriasArticulo = new categoriaTableAdapter();

            try
            {

                DataTable tablaCategoriasArticulos = dbCategoriasArticulo.GetDataByCategoria();

                if (tablaCategoriasArticulos.Rows.Count > 0)
                {
                    foreach (DataRow item in tablaCategoriasArticulos.Rows)
                    {
                        CategoriaArticulo categoriaArticulo = new CategoriaArticulo();

                        categoriaArticulo.CodigoEmpresa = Convert.ToInt16(item["codigo_empresa"]);
                        categoriaArticulo.Codigo = Convert.ToInt16(item["codigo_categoria"]);
                        categoriaArticulo.Descripcion = item["descripcion"].ToString();
                        categoriaArticulo.Activo = Convert.ToByte(item["activo"]);

                        resultados.Add(categoriaArticulo);
                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message + "Error -- Class ArticuloDB -- Methods ObtenerCategoriasDeArticulos()", "Cuidado", MessageBoxButton.OK);
            }

            return resultados;
        }

        public CategoriaArticulo ObtenerCategoriaDeArticulos(int indice)
        {
            CategoriaArticulo categoria = new CategoriaArticulo();

            categoriaTableAdapter categoriaTablaAdapter = new categoriaTableAdapter();

            try
            {
                int codigoEmpresa = empresa.CodigoEmpresa;

                DataTable resultadoConsulta = categoriaTablaAdapter.GetDataByObtenerCategoria((short)indice, (short)codigoEmpresa);

                foreach (DataRow item in resultadoConsulta.Rows)
                {
                    categoria.CodigoEmpresa = Convert.ToInt16(item["codigo_empresa"]);
                    categoria.Codigo = Convert.ToInt16(item["codigo_categoria"]);
                    categoria.Descripcion = item["descripcion"].ToString();
                    categoria.Activo = Convert.ToByte(item["activo"]);
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message + "Error -- Class ArticuloDB -- Methods ObtenerCategoriaDeArticulos(int indice)", "Cuidado", MessageBoxButton.OK);
            }

            return categoria;
        }

        #endregion CRUD Categoria

        public void UpdateCategoriaArticulo(CategoriaArticulo categoriaArticulo, bool mensajeConfirmacion)
        {
            UpdateCategoriaArticulo(categoriaArticulo.Codigo, categoriaArticulo.Descripcion, categoriaArticulo.Activo, mensajeConfirmacion);
        }

        public void DesactivarCategoriaArticulo(CategoriaArticulo categoriaArticulo)
        {
            categoriaTableAdapter categoriaTablaAdapter = new categoriaTableAdapter();

            categoriaTablaAdapter.Connection.Open();

            MySqlTransaction transaccion = categoriaTablaAdapter.Connection.BeginTransaction();

            List<Articulo> articulosDeLaCategoria = ObtenerArticulos(categoriaArticulo.Codigo);

            int cantidadArticulos = articulosDeLaCategoria.Count;

            if (cantidadArticulos > 0)
            {
                foreach (Articulo item in articulosDeLaCategoria)
                {
                    DesactivarArticulo(item);
                }
            }

            try
            {
                CategoriaArticulo categoriaAux = ObtenerCategoriaDeArticulos(categoriaArticulo.Codigo);

                categoriaAux.Activo = 0;

                UpdateCategoriaArticulo(categoriaAux, false);
            }
            catch (Exception e)
            {
                MessageBox.Show("Error DesactivarCategoriaArticulo(CategoriaArticulo categoriaArticulo) - ArticuloDB" + e.Message, "Cuidado", MessageBoxButton.OK);
            }
            finally
            {
                categoriaTablaAdapter.Connection.Close();
            }
        }

        public void ActivarCategoriaArticulo(CategoriaArticulo categoriaArticulo)
        {
            categoriaTableAdapter categoriaTablaAdapter = new categoriaTableAdapter();

            categoriaTablaAdapter.Connection.Open();

            MySqlTransaction transaccion = categoriaTablaAdapter.Connection.BeginTransaction();

            List<Articulo> articulosDeLaCategoria = ObtenerArticulos(categoriaArticulo.Codigo);

            int cantidadArticulos = articulosDeLaCategoria.Count;

            if (cantidadArticulos > 0)
            {
                foreach (Articulo item in articulosDeLaCategoria)
                {
                    ActivarArticulo(item);
                }
            }

            try
            {
                CategoriaArticulo categoriaAux = ObtenerCategoriaDeArticulos(categoriaArticulo.Codigo);

                categoriaAux.Activo = 1;

                UpdateCategoriaArticulo(categoriaAux, false);
            }
            catch (Exception e)
            {
                MessageBox.Show("Error ActivarCategoriaArticulo(CategoriaArticulo categoriaArticulo) - ArticuloDB" + e.Message, "Cuidado", MessageBoxButton.OK);
            }
            finally
            {
                categoriaTablaAdapter.Connection.Close();
            }
        }

        #endregion Categoria

        /**
         * ARTICULOS
         */

        #region Articulo

        #region CRUD Articulo

        //Agrega el articulo a la base de datos
        public void AddArticulo(Articulo articulo)
        {
            int resultadoConsulta;

            articuloTableAdapter articuloTableAdapter = new articuloTableAdapter();
            
            articuloTableAdapter.Connection.Open();
            MySqlTransaction transaccion = articuloTableAdapter.Connection.BeginTransaction();

            try
            {
                int codigoEmpresa = empresa.CodigoEmpresa;
                string descripcion = articulo.Descripcion.ToUpper();
                int codigocategoria = articulo.CodigoCategoriaArticulo;

                List<Articulo> articulosDeLaCategoria = ObtenerArticulos(codigocategoria);

                int codigoArticulo = articulosDeLaCategoria.Count + 1;

                resultadoConsulta = articuloTableAdapter.InsertArticulo((short) codigoEmpresa,(short) codigoArticulo, descripcion, (short)codigocategoria, 1);

                transaccion.Commit();

                if (resultadoConsulta == 1)
                {
                    MessageBox.Show("Operacion de inserción exitosa", "Información", MessageBoxButton.OK);
                }

            }
            catch (Exception e)
            {
                transaccion.Rollback();
                MessageBox.Show("Error AddArticulo(Articulo articulo) - ArticuloDB" + e.Message, "Cuidado", MessageBoxButton.OK);
            }
            finally
            {
                articuloTableAdapter.Connection.Close();
            }
        }

        //Actualizar el articulo
        private void UpdateArticulo(int codigo, string descripcion, int codigoCategoria, byte activo, bool mensajeConfirmacion)
        {

            int resultadoConsulta;

            articuloTableAdapter articuloTablaAdapter = new articuloTableAdapter();

            articuloTablaAdapter.Connection.Open();

            MySqlTransaction transaccion = articuloTablaAdapter.Connection.BeginTransaction();

            try
            {
                int codigoEmpresa = empresa.CodigoEmpresa;

                resultadoConsulta = articuloTablaAdapter.UpdateArticulo(descripcion.ToUpper(), activo, (short)codigo, (short)codigoCategoria, (short)codigoEmpresa);
                transaccion.Commit();

                if (resultadoConsulta == 1 && mensajeConfirmacion)
                {
                    MessageBox.Show("Operacion de actualización exitosa", "Información", MessageBoxButton.OK);
                }
            }
            catch (Exception e)
            {
                transaccion.Rollback();
                MessageBox.Show("Error UpdateArticulo(int codigo, string descripcion, int codigoCategoria, byte activo, bool mensajeConfirmacion) - ArticuloDB" + e.Message, "Cuidado", MessageBoxButton.OK);
            }
            finally
            {
                articuloTablaAdapter.Connection.Close();
            }
        }

        public Articulo ObtenerArticulo(int indice, int codigoCategoria)
        {
            
            Articulo articulo = new Articulo();

            articuloTableAdapter articuloTablaAdapter = new articuloTableAdapter();

            try
            {
                int codigoEmpresa = empresa.CodigoEmpresa;

                DataTable resultadoConsulta = articuloTablaAdapter.GetDataObtenerArticulo((short)indice, (short) codigoCategoria, (short) codigoEmpresa);

                foreach (DataRow item in resultadoConsulta.Rows)
                {
                    articulo.CodigoEmpresa = Convert.ToInt16(item["codigo_empresa"]);
                    articulo.Codigo = Convert.ToInt16(item["codigo_articulo"]);
                    articulo.Descripcion = item["descripcion"].ToString();
                    articulo.CodigoCategoriaArticulo = Convert.ToInt16(item["codigo_categoria"]);
                    articulo.CodigoCategoriaDescripcion = item["categoriaDescripcion"].ToString();
                    articulo.Activo = Convert.ToByte(item["activo"]);
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message + "Error -- Class ArticuloDB -- Methods ObtenerArticulo(int indice, int codigoCategoria)", "Cuidado", MessageBoxButton.OK);
            }

            return articulo;
        }

        #endregion CRUD Articulo

        /** Obtiene una lista de Articulos de la Base de datos segun el indice de la categoria pasada
         * -1 Todos los articulos
         */
        public List<Articulo> ObtenerArticulos(int indiceCategoria)
        {
            List<Articulo> resultados = new List<Articulo>();
            resultados.Clear();

            articuloTableAdapter dbArticulo = new articuloTableAdapter();

            try
            {
                int codigoEmpresa = empresa.CodigoEmpresa;

                DataTable tablaArticulos = new DataTable();

                if (indiceCategoria == -1)
                    tablaArticulos = dbArticulo.GetDataByCategoriasArticulos();
                else
                    tablaArticulos = dbArticulo.GetDataByArticulosSegunCategoria((short)indiceCategoria, (short)codigoEmpresa);

                if (tablaArticulos.Rows.Count > 0)
                {
                    foreach (DataRow item in tablaArticulos.Rows)
                    {
                        Articulo articulo = new Articulo();

                        articulo.CodigoEmpresa = Convert.ToInt16(item["codigo_empresa"]);
                        articulo.Codigo = Convert.ToInt16(item["codigo_articulo"]);
                        articulo.Descripcion = item["descripcion"].ToString();
                        articulo.CodigoCategoriaArticulo = Convert.ToInt16(item["codigo_categoria"]);
                        articulo.CodigoCategoriaDescripcion = item["categoriaDescripcion"].ToString();
                        articulo.Activo = Convert.ToByte(item["activo"]);

                        resultados.Add(articulo);
                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message + "Error -- Class ArticuloDB -- Methods ObtenerArticulos(int indiceCategoria)", "Cuidado", MessageBoxButton.OK);
            }

            return resultados;
        }

        public List<Articulo> ObtenerArticulosSegunEstado(byte activo)
        {
            List<Articulo> resultados = new List<Articulo>();
            resultados.Clear();

            articuloTableAdapter dbArticulo = new articuloTableAdapter();

            try
            {
                int codigoEmpresa = empresa.CodigoEmpresa;

                DataTable tablaArticulos = dbArticulo.GetDataByArticuloSegunEstado((byte)activo, (short) codigoEmpresa);

                if (tablaArticulos.Rows.Count > 0)
                {
                    foreach (DataRow item in tablaArticulos.Rows)
                    {
                        Articulo articulo = new Articulo();

                        articulo.CodigoEmpresa = Convert.ToInt16(item["codigo_empresa"]);
                        articulo.Codigo = Convert.ToInt16(item["codigo_articulo"]);
                        articulo.Descripcion = item["descripcion"].ToString();
                        articulo.CodigoCategoriaArticulo = Convert.ToInt16(item["codigo_categoria"]);
                        articulo.CodigoCategoriaDescripcion = item["categoriaDescripcion"].ToString();
                        articulo.Activo = Convert.ToByte(item["activo"]);

                        resultados.Add(articulo);
                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message + "Error -- Class ArticuloDB -- Methods ObtenerArticulosSegunEstado(byte activo)", "Cuidado", MessageBoxButton.OK);
            }

            return resultados;
        }

        public void UpdateArticulo(Articulo articulo, bool mensajeConfirmacion)
        {
            UpdateArticulo(articulo.Codigo, articulo.Descripcion, articulo.CodigoCategoriaArticulo, articulo.Activo, mensajeConfirmacion);
        }

        public void DesactivarArticulo(Articulo articulo) 
        {
            articuloTableAdapter articuloTablaAdapter = new articuloTableAdapter();

            articuloTablaAdapter.Connection.Open();

            MySqlTransaction transaccion = articuloTablaAdapter.Connection.BeginTransaction();

            List<SubArticulo> subArticulosDelArticulo = ObtenerSubArticulosConDescripcion(articulo);

            int cantidadSubArticulos = subArticulosDelArticulo.Count;

            if (cantidadSubArticulos > 0)
            {
                foreach (SubArticulo item in subArticulosDelArticulo)
                {
                    DesactivarSubArticulo(item);
                }
            }

            try
            {
                Articulo articuloAux = ObtenerArticulo(articulo.Codigo, articulo.CodigoCategoriaArticulo);

                articuloAux.Activo = 0;

                UpdateArticulo(articuloAux, false);
            }
            catch (Exception e)
            {
                MessageBox.Show("Error DesactivarArticulo(Articulo articulo) - ArticuloDB" + e.Message, "Cuidado", MessageBoxButton.OK);
            }
            finally
            {
                articuloTablaAdapter.Connection.Close();
            }

        }

        public void ActivarArticulo(Articulo articulo)
        {
            articuloTableAdapter articuloTablaAdapter = new articuloTableAdapter();

            articuloTablaAdapter.Connection.Open();

            MySqlTransaction transaccion = articuloTablaAdapter.Connection.BeginTransaction();

            List<SubArticulo> subArticulosDelArticulo = ObtenerSubArticulosConDescripcion(articulo);

            int cantidadSubArticulos = subArticulosDelArticulo.Count;

            if (cantidadSubArticulos > 0)
            {
                foreach (SubArticulo item in subArticulosDelArticulo)
                {
                    ActivarSubArticulo(item);
                }
            }

            try
            {
                Articulo articuloAux = ObtenerArticulo(articulo.Codigo, articulo.CodigoCategoriaArticulo);

                articuloAux.Activo = 1;

                UpdateArticulo(articuloAux, false);
            }
            catch (Exception e)
            {
                MessageBox.Show("Error ActivarArticulo(Articulo articulo) - ArticuloDB" + e.Message, "Cuidado", MessageBoxButton.OK);
            }
            finally
            {
                articuloTablaAdapter.Connection.Close();
            }

        }

        #endregion

        /**
         * SUB ARTICULOS
         */

        #region SubArticulo

        #region CRUD SubArticulo

        public void AddSubArticulo(SubArticulo subArticulo)
        {
            int resultadoConsulta;

            subarticuloTableAdapter subArticuloTableAdapter = new subarticuloTableAdapter();
            var subArticuloDataTable = subArticuloTableAdapter.GetData();

            subArticuloTableAdapter.Connection.Open();

            MySqlTransaction transaccion = subArticuloTableAdapter.Connection.BeginTransaction();

            try
            {
                int codigoEmpresa = empresa.CodigoEmpresa;
                string descripcion = subArticulo.Descripcion.ToUpper();
                decimal precioNeto = subArticulo.PrecioNeto;
                int codigoArticulo = subArticulo.CodigoArticulo;
                int codigoCategocia = subArticulo.CodigoCategoria;

                List<SubArticulo> subArticulosDelArticulo = ObtenerSubArticulosConDescripcion(codigoArticulo,codigoCategocia);
                int codigoSubArticulo = subArticulosDelArticulo.Count + 1;

                resultadoConsulta = subArticuloTableAdapter.InsertSubArticulo((short)codigoEmpresa,(short)codigoSubArticulo, descripcion, (decimal)precioNeto, subArticulo.Codigo_Alicuota, (short)codigoArticulo, (short) codigoCategocia, 1);

                transaccion.Commit();

                if (resultadoConsulta == 1)
                {
                    MessageBox.Show("Operacion de inserción exitosa", "Información", MessageBoxButton.OK);
                }
            }
            catch (Exception e)
            {
                transaccion.Rollback();
                MessageBox.Show("Error AddSubArticulo(SubArticulo subArticulo) - ArticuloDB" + e.Message, "Cuidado", MessageBoxButton.OK);
            }
            finally
            {
                subArticuloTableAdapter.Connection.Close();
            }


        }

        private void UpdateSubArticulo(int codigo, string descripcion, int codigo_alicuota, int codigoArticulo, int codigoCategoria, decimal precioNeto, byte activo, bool mensajeConfirmacion)
        {

            int resultadoConsulta;

            subarticuloTableAdapter subArticuloTableAdapter = new subarticuloTableAdapter();

            subArticuloTableAdapter.Connection.Open();

            MySqlTransaction transaccion = subArticuloTableAdapter.Connection.BeginTransaction();

            try
            {
                int codigoEmpresa = empresa.CodigoEmpresa;

                resultadoConsulta = subArticuloTableAdapter.UpdateSubArticulo(descripcion.ToUpper(), precioNeto, (short)codigo_alicuota, activo, (short)codigo, (short) codigoArticulo, (short) codigoCategoria, (short)codigoEmpresa);
                transaccion.Commit();

                if (resultadoConsulta == 1 && mensajeConfirmacion)
                {
                    MessageBox.Show("Operacion de actualización exitosa", "Información", MessageBoxButton.OK);
                }
            }
            catch (Exception e)
            {
                transaccion.Rollback();
                MessageBox.Show("Error UpdateSubArticulo(int codigo, string descripcion, int codigo_alicuota, int codigoArticulo, int codigoCategoria, decimal precioNeto, byte activo, bool mensajeConfirmacion) - ArticuloDB" + e.Message, "Cuidado", MessageBoxButton.OK);
            }
            finally
            {
                subArticuloTableAdapter.Connection.Close();
            }
        }

        public SubArticulo ObtenerSubArticulo(int indice, int codigoArticulo, int codigoCategoria)
        {
            
            SubArticulo subArticulo = new SubArticulo();

            subarticuloTableAdapter subArticuloTablaAdapter = new subarticuloTableAdapter();
            AlicuotaDB alicuotaDB = new AlicuotaDB();

            try
            {

                int codigoEmpresa = empresa.CodigoEmpresa;

                DataTable resultadoConsulta = subArticuloTablaAdapter.GetDataObtenerSubArticulo((short)indice, (short) codigoArticulo, (short) codigoCategoria, codigoEmpresa);

                if (resultadoConsulta.Rows.Count > 0)
                {
                    foreach (DataRow item in resultadoConsulta.Rows)
                    {
                        subArticulo.CodigoEmpresa = Convert.ToInt16(item["codigo_empresa"]);
                        subArticulo.Codigo = Convert.ToInt16(item["codigo_subArticulo"].ToString());
                        subArticulo.Descripcion = item["descripcion"].ToString();
                        subArticulo.PrecioNeto = decimal.Parse(item["precio"].ToString());
                        subArticulo.Codigo_Alicuota = Convert.ToInt16(item["codigo_alicuota"]);
                        subArticulo.Codigo_Alicuota_Tasa = alicuotaDB.GetTasaAlicuota(subArticulo.Codigo_Alicuota);
                        subArticulo.CodigoArticulo = Convert.ToInt16(item["codigo_articulo"].ToString());
                        subArticulo.CodigoCategoria = Convert.ToInt16(item["codigo_categoria"].ToString());
                        subArticulo.CategoriaDescripcion = (ObtenerCategoriaDeArticulos(subArticulo.CodigoCategoria)).Descripcion;
                        subArticulo.ArticuloDescripcion = (ObtenerArticulo(subArticulo.CodigoArticulo, subArticulo.CodigoCategoria)).Descripcion;
                        subArticulo.Activo = Convert.ToByte(item["activo"]);
                    }
                }              
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message + "Error -- Class ArticuloDB -- Methods ObtenerSubArticulo(int indice, int codigoArticulo, int codigoCategoria)", "Cuidado", MessageBoxButton.OK);
            }

            return subArticulo;
        }

        #endregion

        public List<SubArticulo> ObtenerSubArticulosConDescripcion(int indiceArticulo, int codigoCategoria)
        {
            List<SubArticulo> resultados = new List<SubArticulo>();
            resultados.Clear();

            subarticuloTableAdapter dbSubArticulo = new subarticuloTableAdapter();
            AlicuotaDB alicuotaDB = new AlicuotaDB();

            try
            {
                int codigoEmpresa = empresa.CodigoEmpresa;

                DataTable tablaSubArticulos = new DataTable();

                if (indiceArticulo == -1 || codigoCategoria == -1)
                    tablaSubArticulos = dbSubArticulo.GetDataBySubArticulosDescripcion();
                else
                    tablaSubArticulos = dbSubArticulo.GetDataBySubArticuloConCodigoArticulo((short)indiceArticulo, (short) codigoCategoria, (short)codigoEmpresa);

                if (tablaSubArticulos.Rows.Count > 0)
                {
                    foreach (DataRow item in tablaSubArticulos.Rows)
                    {
                        SubArticulo subArticulo = new SubArticulo();

                        subArticulo.CodigoEmpresa = Convert.ToInt16(item["codigo_empresa"]);
                        subArticulo.Codigo = Convert.ToInt16(item["codigo_subArticulo"].ToString());
                        subArticulo.Descripcion = item["descripcion"].ToString();
                        subArticulo.PrecioNeto = decimal.Parse(item["precio"].ToString());
                        subArticulo.Codigo_Alicuota = Convert.ToInt16(item["codigo_alicuota"]);
                        subArticulo.Codigo_Alicuota_Tasa = alicuotaDB.GetTasaAlicuota(subArticulo.Codigo_Alicuota);
                        subArticulo.CodigoArticulo = Convert.ToInt16(item["codigo_articulo"].ToString());
                        subArticulo.CodigoCategoria = Convert.ToInt16(item["codigo_categoria"].ToString());
                        subArticulo.CategoriaDescripcion = (ObtenerCategoriaDeArticulos(subArticulo.CodigoCategoria)).Descripcion;
                        subArticulo.ArticuloDescripcion = (ObtenerArticulo(subArticulo.CodigoArticulo, subArticulo.CodigoCategoria)).Descripcion;
                        subArticulo.Activo = Convert.ToByte(item["activo"]);

                        resultados.Add(subArticulo);
                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message + " Error -- Class ArticuloDB -- Methods ObtenerSubArticulosConDescripcion(int indiceArticulo, int codigoCategoria)", "Cuidado", MessageBoxButton.OK);
            }

            return resultados;
        }

        public List<SubArticulo> ObtenerSubArticulosConDescripcion(Articulo articulo)
        {
            return ObtenerSubArticulosConDescripcion(articulo.Codigo, articulo.CodigoCategoriaArticulo);
        }

        public void UpdateSubArticulo(SubArticulo subArticulo, bool mensajeConfirmacion)
        {
            UpdateSubArticulo(subArticulo.Codigo, subArticulo.Descripcion, subArticulo.Codigo_Alicuota, subArticulo.CodigoArticulo, subArticulo.CodigoCategoria, subArticulo.PrecioNeto, subArticulo.Activo, mensajeConfirmacion);
        }

        public void DesactivarSubArticulo(SubArticulo subArticulo)
        {
            SubArticulo subArticuloAux = subArticulo;
            subArticuloAux.Activo = 0;
            UpdateSubArticulo(subArticuloAux, false);
        }

        public void ActivarSubArticulo(SubArticulo subArticulo)
        {
            SubArticulo subArticuloAux = subArticulo;
            subArticuloAux.Activo = 1;
            UpdateSubArticulo(subArticuloAux, false);
        }

        public List<SubArticulo> ObtenerSubArticulosSegunEstado(byte activo)
        {
            List<SubArticulo> resultados = new List<SubArticulo>();
            resultados.Clear();

            subarticuloTableAdapter dbSubArticulo = new subarticuloTableAdapter();
            AlicuotaDB alicuotaDB = new AlicuotaDB();

            try
            {
                DataTable tablaSubArticulos = new DataTable();

                int codigoEmpresa = empresa.CodigoEmpresa;

                tablaSubArticulos = dbSubArticulo.GetDataBySubArticuloSegunEstado(activo, codigoEmpresa);
                
                if (tablaSubArticulos.Rows.Count > 0)
                {
                    foreach (DataRow item in tablaSubArticulos.Rows)
                    {
                        SubArticulo subArticulo = new SubArticulo();

                        subArticulo.CodigoEmpresa = Convert.ToInt16(item["codigo_empresa"]);
                        subArticulo.Codigo = Convert.ToInt16(item["codigo_subArticulo"].ToString());
                        subArticulo.Descripcion = item["descripcion"].ToString();
                        subArticulo.PrecioNeto = decimal.Parse(item["precio"].ToString());
                        subArticulo.Codigo_Alicuota = Convert.ToInt16(item["codigo_alicuota"]);
                        subArticulo.Codigo_Alicuota_Tasa = alicuotaDB.GetTasaAlicuota(subArticulo.Codigo_Alicuota);
                        subArticulo.CodigoArticulo = Convert.ToInt16(item["codigo_articulo"].ToString());
                        subArticulo.CodigoCategoria = Convert.ToInt16(item["codigo_categoria"].ToString());
                        subArticulo.CategoriaDescripcion = (ObtenerCategoriaDeArticulos(subArticulo.CodigoCategoria)).Descripcion;
                        subArticulo.ArticuloDescripcion = (ObtenerArticulo(subArticulo.CodigoArticulo, subArticulo.CodigoCategoria)).Descripcion;
                        subArticulo.Activo = Convert.ToByte(item["activo"]);

                        resultados.Add(subArticulo);
                    }
                }
                else
                {
                    resultados.Clear();
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message + " Error -- Class ArticuloDB -- Methods ObtenerSubArticulosSegunEstado(byte activo)", "Cuidado", MessageBoxButton.OK);
            }

            return resultados;
        }

        #endregion
    }
}
